通俗的講 IPC 就是程式和程式之間能夠溝通,最常見的例子就是瀏覽器與 Web 伺服器,瀏覽器作為一個程式,向遠在天邊的 Web 伺服器拿取資料。這邊舉一些 IPC 的例子:
用螢幕截圖軟體截圖儲存成圖檔後用其他軟體開啟→檔案;
玩線上遊戲→Socket;
D-Bus、Pipe 等等都是 IPC 的一種。
資料的生產者與消費者這樣的模式在軟體工程中十分常見:
顯卡算圖,演算法就是生產者,螢幕就是消費者;
對 Web 而言,使用者既是生產者(request 的生產者)也是消費者(response 的消費者);
在 ReactiveX 中,事件流的起點就是生產者,事件流的終點就是消費者;
廣義來講 CI/CD 中的 repo 就是生產者,deploy 就是消費者。
說白了,不少軟體就是做著轉換的工作,
把 javascript 轉換成 javascript bundle,
把 sass 轉換成 css,
把 javascript 轉換成 HTML DOM,
把原始碼轉成二進制執行檔,
把 event 轉換成 request,
把 request 轉換成 response,
把 response 轉換成 View...
因為轉換這個行為有輸入、有輸出,理所當然的我們可以像人形蜈蚣一樣,把輸出再倒給另外一個程式的輸入。
Unix 的 Standard streams 分別包含了標準輸入 (stdin)、標準輸出 (stdout) 和標準錯誤輸出 (stderr)。
可以把程式想像成有一個輸入的界面 (stdin) 和兩個輸出的界面 (stdout, stderr)。
對於有寫過 C++ 的朋友們,想必對 std:cin
和 std:cout
不會太陌生吧?
#include <iostream>
using namespace std;
int main( ) {
int age;
cout << "Enter your age: ";
cin >> age;
cout << "Your age is: " << age << endl;
}
沒錯,它們就是對應了 stdin 和 stdout。
Pipe 是一種 IPC,有操作過 Linux 的朋友應該使用過類似這樣的指令吧?
ls | grep something
這就是一個使用了 pipe 的例子:ls
指令的輸出會倒給 grep
,而且這個 pipe 就像人型蜈蚣一樣,可以一直串連接下去。
這裡簡單展示一個比較複雜的 pipe 使用例子:
cat *.png | \
ffmpeg -hide_banner \
-y \
-framerate 20 \
-f png_pipe \
-i pipe:0 \
-c:v libx264 \
-pix_fmt rgb24 \
-r 20 \
-crf 0 \
-f nut \
pipe:1 |
mpv -
這串指令做的事情是這樣的,cat
-> ffmpeg
-> mpv
cat
把讀取圖片並把資料流送到 stdout
ffmpeg
從 stdpin
擷取 png 資料並轉換成影片後送到 stdout
mpv
從 stding
獲取影像串流後播放到播放器上